package com.zhx.service;

import com.zhx.dao.LoginLogDao;
import com.zhx.dao.UserDao;
import com.zhx.domain.LoginCommand;
import com.zhx.domain.LoginLog;
import com.zhx.domain.User;
import com.zhx.util.EhcacheUtil;
import net.sf.ehcache.Ehcache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.servlet.ModelAndView;
import sun.nio.cs.US_ASCII;

import java.text.SimpleDateFormat;

/**
 * @program: UserService
 * @author: zhx
 * @create: 2021-03-22 21:10
 **/
@Service //将userservice标注为一个服务层的bean
public class UserService {
    private UserDao userDao;
    private LoginLogDao loginLogDao;

    @Autowired  //自动注入userDao的bean
    public void setUserDao(UserDao userDao){
        this.userDao=userDao;
    }

    @Autowired //自动注入loginLogDao的bean
    public void setLoginLogDao(LoginLogDao loginLogDao){
        this.loginLogDao=loginLogDao;
    }


    /**
     * 检查user缓冲中是否有这个用户,判断是否需要锁定这个 用户
     */
    public boolean isLock(String userName){
        //先检查user缓冲中是否有这个用户
        int cacheUserCount = findCacheUserCount("user",userName);
        if (cacheUserCount == 1){ //说明缓冲中有这个用户名
            //需要锁定，一分钟
            return false;
        }else{
            return true;
        }
    }
    /**
     * 根据用户名 和 密码，看是否能匹配到
     * @param userName
     * @param passWord
     * @return
     */
    public boolean hasMatchUser(String userName,String passWord){
        int matchCount = userDao.getMatchCount(userName, passWord);
        if (matchCount==0){
            //登陆失败，需要在users缓冲中+1
            insertCacheUser(userName);
            LoginLog loginLog = new LoginLog();
            loginLog.setUserId(0); //0表示没有这个用户，但这个用户尝试登陆
            //插入日志表，但是没有时间，表示登陆失败
            loginLogDao.insertLogLog(loginLog);
        }else{
            //登陆成功，删除users的缓冲
            removeCache("users", userName);
            //插入日志表
        }
        return matchCount > 0;
    }

    /**
     * 根据用户名 返回当前用户的信息
     * @param userName
     * @return
     */
    public User findUserByUserName(String userName){
        return userDao.findUserByUserName(userName);
    }
    //点击登陆的时候，
        // 进行先判断user这个缓冲中是否有这个用户名
        // 如果有，显示锁定一分钟，
        // 如果没有，就判断是否登录成功，
            //失败，users缓冲中的用户访问次数+1，并判断是否大于等于3，是就把这个用户添加到user缓冲中
            //成功，删除users中这个用户的缓冲
     //删除缓冲
    public void removeCache(String cacheName,String userName){
        EhcacheUtil.remove(cacheName, userName);
    }
    //插入缓冲中，users缓冲中存的是 <用户名,出错次数>
    public void insertCacheUser(String userName){
        Object users = EhcacheUtil.get("users", userName);
        if (users == null){
            EhcacheUtil.put("users", userName, 1);
        }else{
            EhcacheUtil.put("users", userName, 1 + (int)users);
            int users1 = (int) EhcacheUtil.get("users", userName);
            if (users1>=3){
                //插入user缓冲中
                EhcacheUtil.put("user",userName ,1 );
            }
        }
    }
    //查询缓冲
    public int findCacheUserCount(String cacheName,String userName){
        Object users = EhcacheUtil.get(cacheName, userName);
        if (users == null){
            return 0;
        }else{
            return (int)users;
        }
    }

    /**
     * 验证成功，需要更新用户表的积分，并插入登陆日志表中这次登陆的信息
     * @param user
     */
    @Transactional  //事务注解
    public void loginSuccess(User user) throws Exception {
        try {
            user.setCredits(5 + user.getCredits());
            user.setLastIp("127.0.0.1");
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String time = simpleDateFormat.format(System.currentTimeMillis());
            user.setLastvisit(time);
            System.out.println(user.toString());
            User user1 = userDao.updateLoginInfo(user);
            if (user1 == null){
                throw new Exception("登陆失败");
            }
        }catch (Exception e){
            LoginLog loginLog = new LoginLog();
            loginLog.setUserId(user.getUserId()); //0表示没有这个用户，但这个用户尝试登陆
            //插入日志表，但是没有时间，表示登陆失败
            loginLogDao.insertLogLog(loginLog);
            throw new Exception("登陆失败");
        }
    }

    /**
     * @param loginCommand
     * @return
     *
     * 进行用户注册,需要注册的信息有 userName，passWord，credits
     */
    @Transactional
    public Boolean registerUser(LoginCommand loginCommand) throws Exception {
        try {
            if (loginCommand!=null){
                String userName = loginCommand.getUserName();
                String passWord = loginCommand.getPassWord();
                if (userName!=null && !userName.equals("") && passWord!=null && !passWord.equals("")){
                    int credits = 0;
                    User user = new User();
                    user.setUserName(userName);
                    user.setPassWord(passWord);
                    user.setCredits(credits);
                    user.setLastIp("127.0.0.1");
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String time = simpleDateFormat.format(System.currentTimeMillis());
                    user.setRegisterTime(time);
                    user.setLastvisit(null);
                    User user1 = userDao.insertUser(user);
                    if (user1 != null){
                        return true;
                    }else{
                        return false;
                    }
                }else{
                    return false;
                }
            }else{
                return false;
            }
        }catch (Exception e){
            throw new Exception("注册失败");
        }
    }
}
